iT邦幫忙

2023 iThome 鐵人賽

DAY 23
0
Software Development

Spring Boot 零基礎入門系列 第 23

Spring Boot 零基礎入門 (23) - Http status code(Http 狀態碼)介紹

  • 分享至 

  • xImage
  •  

賀!此系列文榮獲 2023 iThome 鐵人賽《優選》獎項,正在規劃出書中,感謝大家的支持🙏,同名課程「Java 工程師必備!Spring Boot 零基礎入門」也已在 Hahow 平台上架

哈囉大家好,我是古古

在前面的文章中,我們介紹了什麼是 Http 協議、Json 格式、如何接住前端的請求參數、以及如何設計 RESTful API....等等主題

那麼接著這篇文章,我們就會來介紹在 Http response 中很重要的一個部分,也就是 Http status code(Http 狀態碼)

什麼是 Http status code(Http 狀態碼)?


Http status code 又稱為 Http 狀態碼,他是屬於 Http response 的一部分

而 Http status code 的目的,是用來「表示這次 Http request 的結果為何」,所以簡單的說的話,Http status code 就是會透過一串數字,告訴前端說,這一次的 Http request 到底是成功還是失敗這樣

因此有了 Http status code 之後,前端就不用在拿到 Http response 時,花很多力氣去查看 response body 中的資訊,前端只要透過這個 Http status code,就可以知道這次的 Http request 結果大概為何,想要查看具體的細節的話,再回頭去查看 response body 即可

https://ithelp.ithome.com.tw/upload/images/20231007/20151036uQlgfsuo0d.png

Http status code 中的分類


Http status code 可以根據 「首位數字」,分成 5 個大類,分別是:

  • 1xx:資訊
  • 2xx : 成功
  • 3xx : 重新導向
  • 4xx : 前端請求錯誤
  • 5xx : 後端處理有問題

在每一個大類中,可以再去細分出更多的 status code 出來,不過只要在同一個大類中的 status code,他們的意思都是類似的

譬如說像是 2xx 的 status code,他們所代表的都是「成功」的意思,而 4xx 的狀態碼,他們所代表的,就都是「前端請求錯誤」的意思

像是我們之前在 API Tester 發起 Http request 時,很常會遇到下面的 Http response 中回傳了 200 的 status code,那這個「200」,就是屬於「2xx - 成功」的這一大類

https://ithelp.ithome.com.tw/upload/images/20231007/20151036MkRY96PQ18.png

大概了解了 Http status code 的用途以及分類之後,那麼接下來,我們就來詳細的介紹每一個大類,底下都有哪些 Http status code

補充:因為 http status code 實在太多,因此這邊只會列出比較常見的 status code,如果大家有遇到一些比較罕見的 status code,可以再上網查詢一下相關的意思

1xx:資訊


我們可以先從 1 開頭的大類開始看起,1 開頭的 Http status code 代表的,是「取得資訊」的意思,不過一般來說 1 開頭的 status code 非常少用,因此這邊沒有列出常見的 http status code

2xx:成功


2 開頭的 http status code 所代表的,就都是「請求成功」的意思

而 2 開頭的大類,在使用上可以說是非常頻繁了,常見的有以下三個:

https://ithelp.ithome.com.tw/upload/images/20231007/20151036mC1ud6i8GX.png

200 OK

首先第一個是 200 OK,200 所代表的,就是「這一次的 http 請求成功了」

200 可以說是使用最廣泛的一個 http status code,基本上只要看到 200 心情就會很好XD(特殊情境例外),可以說是工程師裡面的天使等級的角色

201 Created

第二個則是 201 Created,201 所代表的,不僅是這一次的 http 請求成功而已,他還額外表示「有一個新的資源成功被創建了」

也因為 201 除了表示成功之外,還多表示了「創建資源成功」的含義,因此 201 通常是被用在 POST 方法的 response 中(因為 REST 風格中的 POST 就是對應到資料庫的創建操作)

202 Accepted

最後一個則是 202 Accepted,202 所代表的,是「這一次的請求已經被接受了,但是尚未處理完成」這樣,其實 202 可以簡單的想像成是你拜託別人去買東西,但是他還在買的路上,還沒買好這樣

所以當大家以後看到 202 的時候,就知道說其實後端開始處理這件事情了,只是還沒處理完成而已

補充:每一個 http status code,都會有一個專屬的英文短語,用來表達這個 http status code 的意思,像是 200 他所對應的英文短語,就是 OK,而像 202 所對應的短語,就是 Accepted

所以這個短語的用途,就只是簡短的去描述這個 status code 是什麼意思而已,進而幫助工程師了解這個 status code 的含義是什麼

3xx:重新導向


3 開頭的 http status code 所代表的,都是「重新導向」的意思

3 開頭的大類,在使用上大概是普通的程度,他出現的沒有其他人那麼頻繁,但是偶爾也是會看得到他的蹤影,常見的有以下兩個:

https://ithelp.ithome.com.tw/upload/images/20231007/20151036eyJbySpJEN.png

301 Moved Permanently

首先是 301 Moved Permanently,301 所代表的,是「這個 url 永久性的搬家了」

所以當前端去請求某個 url,然後發現 reponse 裡面的所回傳的 http status code 是 301 時,前端就知道這個 url 已經失效了

通常後端在回傳 301 的時候,同時也會將新的 url 放在 response header 裡面,告訴前端要去哪裡找新家,所以前端就可以改成去請求這個新的 url

302 Found

再來是 302 Found,302 所代表的,是「這個 url 暫時性的搬家」

通常後端在回傳 302 的時候,也是會將新的 url 放在 response header 裡面,告訴前端要去哪裡找新家,所以前端就可以改成去請求這個新的 url

所以,301 和 302 差在哪裡?

總合上面的介紹,301 和 302 的差別,就只是這個 url 是「永久性的搬家」還是「暫時性的搬家」而已,對於後端這邊來說,在設計上都是要將新的 url 放在 response header 裡面,告訴前端新的 url 在哪裡

4xx:前端請求錯誤


4 開頭的 http status code 所代表的,就都是「前端請求錯誤」的意思

4 開頭的大類,在使用上也是滿常用的,常見的有以下四個:

https://ithelp.ithome.com.tw/upload/images/20231007/20151036mMktu9KEwQ.png

400 Bad Request

首先是 400 Bad Request,400 所代表的,就是「前端的請求參數有錯誤」的意思

譬如說前端傳給後端的參數名稱不同、或是說請求的格式有問題,都是可以被歸類在 400 這個 status code,所以以後只要看到 400,通常第一件事,就是回頭檢查一下是不是請求的參數寫錯了

401 Unauthorized、403 Forbidden

401 和 403 通常會一起介紹,他們是滿容易被搞混的 http staus code

首先是 401 Unauthorized,401 所代表的,是 「沒有通過身份驗證」 的意思

下一個是 403 Forbidden,403 所代表的,則是「這一次的請求被後端拒絕」,這個拒絕通常是因為 權限不足 導致的

舉例來說,大家可以把 401 想像成是會員的「身份驗證錯誤」,譬如說帳密輸入錯誤的這種,那後端就會返回 401 Unauthorized,告訴前端說:這個人並不是我們網站的會員

而 403 則是「權限不足」的意思,譬如說普通會員想要看 VIP 會員才能看的影片,那這時候後端就會返回 403 給前端,告訴前端說:這個會員的權限不足,所以我們不能讓他看 VIP 會員才能看的影片

所以簡單的說的話,當大家看到 401 的時候,就是表示「這個使用者根本不是我們家的會員」,而看到 403 的時候,就表示「這個會員他沒有權限,去執行這個功能」

404 Not Found

最後一個則是 404 Not Found,404 所代表的,是「這個網頁不存在」的意思,通常就是由於 url 輸入錯誤、或是 url 失效(該資源被移走)所導致的

404 是一個生活中還滿常見的 http status code,有時候大家在網路上看文章的時候,偶爾會遇到 404 Not Found 的錯誤,就是因為這個 url 失效了

5xx:後端處理有問題


5 開頭的 http status code 所代表的,就都是「後端處理有問題」的意思

5 開頭的大類,可以說是後端工程師最不想看見的一類(因為看見了這個,通常就表示你或你同事要加班修 bug 了🥹),常見的有以下三個:

https://ithelp.ithome.com.tw/upload/images/20231007/201510363vhdRyoIHw.png

500 Internal Server Error

首先是 500 Internal Server Error,500 所代表的,是「後端在處理這次請求的時候發生了錯誤」,那這個錯誤,可能是因為後端程式出了 bug、或是其他的原因造成的

500 也是一個滿常見的 status code,通常只要看到 500,就表示是後端這邊有問題,所以後端工程師就得去檢查一下,是不是 Spring Boot 程式寫出 bug 之類的,所以一般來說,大家都很恐懼看到 500 這個 status code,因為這就表示後端這邊出問題了🥹

503 Service Unavailable

再來是 503 Service Unavailable,503 所代表的,是「臨時維護或者流量太大,所以後端目前沒有辦法處理請求」

所以當大家看到 status code 是 503 時,可能是瞬間流量太高導致後端伺服器忙不過來,使得後端沒辦法正常運作,或是後端程式就是剛好處在維護期間這樣,反正結論都是後端沒辦法正常服務大家就對了

504 Gateway Timeout

最後一個是 504 Gateway Timeout,504 所代表的,是「這一次的請求超時了」

這裡的「請求超時」的意思是指說:這一次 http 請求花了太長的時間都還沒有完成,所以就直接強制結束的意思

所以當大家看到 504 時,就表示後端內部系統出了問題,沒辦法在一定時間內跑完所有程式,而後端為了避免你等太久,就提前斷尾求生返回一個 504 的錯誤給你,告訴你這個情況這樣

小結:Http status code 五大類


所以總結上面的介紹的話,大家之後就可以透過 Http status code,去知道「這次 Http request 的結果」為何了

而當遇到比較少見的 http status code 時,也可以先根據他的 「首位數字」,去知道他想表達的是哪一個方向的錯誤:

  • 1xx:資訊
  • 2xx : 成功
  • 3xx : 重新導向
  • 4xx : 前端請求錯誤
  • 5xx : 後端處理有問題

總結


這篇文章先介紹了什麼是 Http status code,並且也介紹了 Http status code 是如何透過首位數字區分成五大類,然後也詳細介紹了每個大類中,常見的 http status code 有哪些

那所以到這篇文章為止,有關於 Spring MVC 的介紹就告一個段落了,在這個章節中,我們先介紹了「Http 協議」和「Json 格式」這些前後端通用的溝通方式,接著也介紹了常見的 Http method、要如何接住前端所傳過來的參數、以及要如何去設計出 RESTful API....等等,最後也介紹了常見的 Http status code 有哪些,讓大家對 Spring MVC 有更多的了解

那麼從下一篇文章開始,我們就會進入到下一個章節:Spring JDBC,來了解要如何在 Spring Boot 中和「資料庫」進行溝通,那我們就下一篇文章見啦!

相關連結



上一篇
Spring Boot 零基礎入門 (22) - 實作 RESTful API - @GetMapping、@PostMapping...
下一篇
Spring Boot 零基礎入門 (24) - Spring JDBC 簡介
系列文
Spring Boot 零基礎入門30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 則留言

0
trytrycan13
iT邦新手 5 級 ‧ 2023-10-07 22:03:50

再來是 302 Found,302 所代表的,是「這個 url 暫時性的搬家」
通常後端在回傳 301 的時候,也是會將新的 url 放在 response header 裡面

感覺這邊的語意是否為,「通常後端在回傳 302 的時候」,也是會將....

古古 iT邦新手 3 級 ‧ 2023-10-07 23:42:46 檢舉

感謝提醒!已修正(拍謝複製太快沒改到🥹)

我要留言

立即登入留言